{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 根据词频进行活动聚类"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 1、数据读取与PCA降维"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "由于不同关键词之间可能有一些词的词频之间存在一定线性关系，所以我认为聚类之前可以尝试适当的PCA降维"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "#导入必要的工具包\n",
    "import pandas as pd\n",
    "import numpy as np\n",
    "from sklearn import svm# 1、由于不同关键词之间可能有一些词的词频之间存在一定线性关系，所以我认为聚类之前可以尝试适当的PCA降维\n",
    "from sklearn.model_selection import train_test_split\n",
    "from sklearn.decomposition import PCA\n",
    "import time"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [],
   "source": [
    "#读取活动数据\n",
    "edata = pd.read_csv('eventdata.csv')\n",
    "#数据概览\n",
    "#edata.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [],
   "source": [
    "#数据统计信息\n",
    "#edata.describe()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [],
   "source": [
    "#删掉不需要的特征列\n",
    "edata = edata.drop(\"Unnamed: 0\",axis=1)\n",
    "edata = edata.drop(\"event_id\",axis=1)\n",
    "edata = edata.drop(\"user_id\",axis=1)\n",
    "edata = edata.drop(\"lat\",axis=1)\n",
    "edata = edata.drop(\"lng\",axis=1)\n",
    "edata = edata.drop(\"start_time\",axis=1)\n",
    "edata = edata.drop(\"city\",axis=1)\n",
    "edata = edata.drop(\"state\",axis=1)\n",
    "edata = edata.drop(\"zip\",axis=1)\n",
    "edata = edata.drop(\"country\",axis=1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>c_1</th>\n",
       "      <th>c_2</th>\n",
       "      <th>c_3</th>\n",
       "      <th>c_4</th>\n",
       "      <th>c_5</th>\n",
       "      <th>c_6</th>\n",
       "      <th>c_7</th>\n",
       "      <th>c_8</th>\n",
       "      <th>c_9</th>\n",
       "      <th>c_10</th>\n",
       "      <th>...</th>\n",
       "      <th>c_92</th>\n",
       "      <th>c_93</th>\n",
       "      <th>c_94</th>\n",
       "      <th>c_95</th>\n",
       "      <th>c_96</th>\n",
       "      <th>c_97</th>\n",
       "      <th>c_98</th>\n",
       "      <th>c_99</th>\n",
       "      <th>c_100</th>\n",
       "      <th>c_other</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>27</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>39</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>18</td>\n",
       "      <td>7</td>\n",
       "      <td>7</td>\n",
       "      <td>3</td>\n",
       "      <td>9</td>\n",
       "      <td>4</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>2</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>249</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 101 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "   c_1  c_2  c_3  c_4  c_5  c_6  c_7  c_8  c_9  c_10   ...     c_92  c_93  \\\n",
       "0    0    0    0    0    0    3    0    0    0     0   ...        0     0   \n",
       "1    1    2    0    0    0    0    0    0    0     0   ...        0     0   \n",
       "2    0    0    0    0    0    0    0    0    0     0   ...        0     0   \n",
       "3    2    0    0    0    2    0    0    0    0     0   ...        0     0   \n",
       "4   18    7    7    3    9    4    2    0    2     2   ...        0     0   \n",
       "\n",
       "   c_94  c_95  c_96  c_97  c_98  c_99  c_100  c_other  \n",
       "0     0     0     0     0     0     0      0       27  \n",
       "1     0     0     0     1     0     0      0       39  \n",
       "2     0     0     0     0     0     0      0        2  \n",
       "3     0     0     0     0     0     0      0        3  \n",
       "4     1     0     1     2     0     0      1      249  \n",
       "\n",
       "[5 rows x 101 columns]"
      ]
     },
     "execution_count": 27,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "edata.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>c_1</th>\n",
       "      <th>c_2</th>\n",
       "      <th>c_3</th>\n",
       "      <th>c_4</th>\n",
       "      <th>c_5</th>\n",
       "      <th>c_6</th>\n",
       "      <th>c_7</th>\n",
       "      <th>c_8</th>\n",
       "      <th>c_9</th>\n",
       "      <th>c_10</th>\n",
       "      <th>...</th>\n",
       "      <th>c_92</th>\n",
       "      <th>c_93</th>\n",
       "      <th>c_94</th>\n",
       "      <th>c_95</th>\n",
       "      <th>c_96</th>\n",
       "      <th>c_97</th>\n",
       "      <th>c_98</th>\n",
       "      <th>c_99</th>\n",
       "      <th>c_100</th>\n",
       "      <th>c_other</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>count</th>\n",
       "      <td>13418.000000</td>\n",
       "      <td>13418.000000</td>\n",
       "      <td>13418.000000</td>\n",
       "      <td>13418.000000</td>\n",
       "      <td>13418.000000</td>\n",
       "      <td>13418.000000</td>\n",
       "      <td>13418.000000</td>\n",
       "      <td>13418.000000</td>\n",
       "      <td>13418.000000</td>\n",
       "      <td>13418.000000</td>\n",
       "      <td>...</td>\n",
       "      <td>13418.000000</td>\n",
       "      <td>13418.000000</td>\n",
       "      <td>13418.000000</td>\n",
       "      <td>13418.000000</td>\n",
       "      <td>13418.000000</td>\n",
       "      <td>13418.000000</td>\n",
       "      <td>13418.000000</td>\n",
       "      <td>13418.000000</td>\n",
       "      <td>13418.000000</td>\n",
       "      <td>13418.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>mean</th>\n",
       "      <td>2.359964</td>\n",
       "      <td>1.464972</td>\n",
       "      <td>1.323372</td>\n",
       "      <td>0.888732</td>\n",
       "      <td>1.159711</td>\n",
       "      <td>2.479654</td>\n",
       "      <td>0.986809</td>\n",
       "      <td>0.584439</td>\n",
       "      <td>0.660754</td>\n",
       "      <td>0.552914</td>\n",
       "      <td>...</td>\n",
       "      <td>0.064913</td>\n",
       "      <td>0.083992</td>\n",
       "      <td>0.093755</td>\n",
       "      <td>0.070502</td>\n",
       "      <td>0.082427</td>\n",
       "      <td>0.233790</td>\n",
       "      <td>0.082874</td>\n",
       "      <td>0.076837</td>\n",
       "      <td>0.073558</td>\n",
       "      <td>57.554777</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>std</th>\n",
       "      <td>19.331141</td>\n",
       "      <td>2.959769</td>\n",
       "      <td>2.720104</td>\n",
       "      <td>1.972209</td>\n",
       "      <td>15.695718</td>\n",
       "      <td>7.375475</td>\n",
       "      <td>18.371845</td>\n",
       "      <td>1.395134</td>\n",
       "      <td>1.630597</td>\n",
       "      <td>1.243510</td>\n",
       "      <td>...</td>\n",
       "      <td>0.309890</td>\n",
       "      <td>0.377730</td>\n",
       "      <td>0.388404</td>\n",
       "      <td>0.312148</td>\n",
       "      <td>0.503164</td>\n",
       "      <td>15.553234</td>\n",
       "      <td>0.356777</td>\n",
       "      <td>0.455338</td>\n",
       "      <td>0.337954</td>\n",
       "      <td>110.916584</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>min</th>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>...</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25%</th>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>...</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>14.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>50%</th>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>...</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>38.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>75%</th>\n",
       "      <td>3.000000</td>\n",
       "      <td>2.000000</td>\n",
       "      <td>2.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>2.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>...</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>75.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>max</th>\n",
       "      <td>2186.000000</td>\n",
       "      <td>82.000000</td>\n",
       "      <td>85.000000</td>\n",
       "      <td>71.000000</td>\n",
       "      <td>1801.000000</td>\n",
       "      <td>306.000000</td>\n",
       "      <td>2120.000000</td>\n",
       "      <td>23.000000</td>\n",
       "      <td>51.000000</td>\n",
       "      <td>51.000000</td>\n",
       "      <td>...</td>\n",
       "      <td>7.000000</td>\n",
       "      <td>9.000000</td>\n",
       "      <td>10.000000</td>\n",
       "      <td>9.000000</td>\n",
       "      <td>23.000000</td>\n",
       "      <td>1801.000000</td>\n",
       "      <td>9.000000</td>\n",
       "      <td>16.000000</td>\n",
       "      <td>7.000000</td>\n",
       "      <td>9664.000000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>8 rows × 101 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "                c_1           c_2           c_3           c_4           c_5  \\\n",
       "count  13418.000000  13418.000000  13418.000000  13418.000000  13418.000000   \n",
       "mean       2.359964      1.464972      1.323372      0.888732      1.159711   \n",
       "std       19.331141      2.959769      2.720104      1.972209     15.695718   \n",
       "min        0.000000      0.000000      0.000000      0.000000      0.000000   \n",
       "25%        0.000000      0.000000      0.000000      0.000000      0.000000   \n",
       "50%        1.000000      0.000000      0.000000      0.000000      0.000000   \n",
       "75%        3.000000      2.000000      2.000000      1.000000      1.000000   \n",
       "max     2186.000000     82.000000     85.000000     71.000000   1801.000000   \n",
       "\n",
       "                c_6           c_7           c_8           c_9          c_10  \\\n",
       "count  13418.000000  13418.000000  13418.000000  13418.000000  13418.000000   \n",
       "mean       2.479654      0.986809      0.584439      0.660754      0.552914   \n",
       "std        7.375475     18.371845      1.395134      1.630597      1.243510   \n",
       "min        0.000000      0.000000      0.000000      0.000000      0.000000   \n",
       "25%        0.000000      0.000000      0.000000      0.000000      0.000000   \n",
       "50%        0.000000      0.000000      0.000000      0.000000      0.000000   \n",
       "75%        2.000000      1.000000      1.000000      1.000000      1.000000   \n",
       "max      306.000000   2120.000000     23.000000     51.000000     51.000000   \n",
       "\n",
       "           ...               c_92          c_93          c_94          c_95  \\\n",
       "count      ...       13418.000000  13418.000000  13418.000000  13418.000000   \n",
       "mean       ...           0.064913      0.083992      0.093755      0.070502   \n",
       "std        ...           0.309890      0.377730      0.388404      0.312148   \n",
       "min        ...           0.000000      0.000000      0.000000      0.000000   \n",
       "25%        ...           0.000000      0.000000      0.000000      0.000000   \n",
       "50%        ...           0.000000      0.000000      0.000000      0.000000   \n",
       "75%        ...           0.000000      0.000000      0.000000      0.000000   \n",
       "max        ...           7.000000      9.000000     10.000000      9.000000   \n",
       "\n",
       "               c_96          c_97          c_98          c_99         c_100  \\\n",
       "count  13418.000000  13418.000000  13418.000000  13418.000000  13418.000000   \n",
       "mean       0.082427      0.233790      0.082874      0.076837      0.073558   \n",
       "std        0.503164     15.553234      0.356777      0.455338      0.337954   \n",
       "min        0.000000      0.000000      0.000000      0.000000      0.000000   \n",
       "25%        0.000000      0.000000      0.000000      0.000000      0.000000   \n",
       "50%        0.000000      0.000000      0.000000      0.000000      0.000000   \n",
       "75%        0.000000      0.000000      0.000000      0.000000      0.000000   \n",
       "max       23.000000   1801.000000      9.000000     16.000000      7.000000   \n",
       "\n",
       "            c_other  \n",
       "count  13418.000000  \n",
       "mean      57.554777  \n",
       "std      110.916584  \n",
       "min        0.000000  \n",
       "25%       14.000000  \n",
       "50%       38.000000  \n",
       "75%       75.000000  \n",
       "max     9664.000000  \n",
       "\n",
       "[8 rows x 101 columns]"
      ]
     },
     "execution_count": 28,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#数据统计信息\n",
    "edata.describe()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 0,  0,  0, ...,  0,  0, 27],\n",
       "       [ 1,  2,  0, ...,  0,  0, 39],\n",
       "       [ 0,  0,  0, ...,  0,  0,  2],\n",
       "       ...,\n",
       "       [ 3,  1,  2, ...,  0,  0, 18],\n",
       "       [ 2,  0,  0, ...,  0,  0, 65],\n",
       "       [ 0,  0,  0, ...,  0,  0,  8]], dtype=int64)"
      ]
     },
     "execution_count": 29,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "edata=np.array(edata)\n",
    "edata"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[0.        , 0.        , 0.        , ..., 0.        , 0.        ,\n",
       "        0.00279387],\n",
       "       [0.00045746, 0.02439024, 0.        , ..., 0.        , 0.        ,\n",
       "        0.0040356 ],\n",
       "       [0.        , 0.        , 0.        , ..., 0.        , 0.        ,\n",
       "        0.00020695],\n",
       "       ...,\n",
       "       [0.00137237, 0.01219512, 0.02352941, ..., 0.        , 0.        ,\n",
       "        0.00186258],\n",
       "       [0.00091491, 0.        , 0.        , ..., 0.        , 0.        ,\n",
       "        0.00672599],\n",
       "       [0.        , 0.        , 0.        , ..., 0.        , 0.        ,\n",
       "        0.00082781]])"
      ]
     },
     "execution_count": 30,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#数据归一化\n",
    "from sklearn.preprocessing import MinMaxScaler as MM\n",
    "mm=MM()\n",
    "edata=mm.fit_transform(edata)\n",
    "edata"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 435,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "the shape of train_image: (13418L, 101L)\n"
     ]
    }
   ],
   "source": [
    "# 原始输入的特征维数和样本数目\n",
    "print('the shape of train_image: {}'.format(edata.shape))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 436,
   "metadata": {},
   "outputs": [],
   "source": [
    "#进行PCA降维\n",
    "#pca = PCA(n_components=0.99)\n",
    "\n",
    "#pca.fit(edata)\n",
    "#edata_pca = pca.transform(edata)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 437,
   "metadata": {},
   "outputs": [],
   "source": [
    "#pca.n_components_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 438,
   "metadata": {},
   "outputs": [],
   "source": [
    "#降维后的特征维数\n",
    "#print(edata_pca.shape)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "PCA降维过程我统一到了后面的for循环里，与K一起搜索。可根据聚类效果看多大的降维比例系数更合适"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 2、进行K-Means聚类"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 439,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.cluster import MiniBatchKMeans\n",
    "from sklearn import metrics\n",
    "\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 440,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 一个参数点（聚类数据为K）的模型，在校验集上评价聚类算法性能\n",
    "def K_cluster_analysis(K, X_train, X_val):\n",
    "    start = time.time()\n",
    "    \n",
    "    print(\"K-means begin with clusters: {}\".format(K));\n",
    "    \n",
    "    #K-means,在训练集上训练\n",
    "    mb_kmeans = MiniBatchKMeans(n_clusters = K)\n",
    "    mb_kmeans.fit(X_train)\n",
    "    \n",
    "    # 在训练集和校验集上测试\n",
    "    #y_train_pred = mb_kmeans.fit_predict(X_train)\n",
    "    y_val_pred = mb_kmeans.predict(X_val)\n",
    "    \n",
    "    # K值的评估标准\n",
    "    #常见的方法有轮廓系数Silhouette Coefficient和Calinski-Harabasz Index\n",
    "    #这两个分数值越大则聚类效果越好\n",
    "    #CH_score_train = metrics.calinski_harabaz_score(X_train,mb_kmeans.predict(X_train))\n",
    "    CH_score_val = metrics.silhouette_score(X_val,mb_kmeans.predict(X_val))\n",
    "    \n",
    "    end = time.time()\n",
    "    #print(\"CH_score on train: {}, time elaps:{}\".format(CH_score_train, int(end-start)))\n",
    "    print(\"CH_score on val: {}\".format(CH_score_val))\n",
    "    \n",
    "    return CH_score_val"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 441,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 一个参数点（主成分比例为n_components）的数据集，并划分训练集与校验集，显示降维后的数据维度\n",
    "def pca_analysis(data,n_components=None):\n",
    "    pca = PCA(n_components)\n",
    "    pca.fit(data)\n",
    "    data_pca = pca.transform(data)\n",
    "    X_train_part, X_val = train_test_split(data_pca, train_size = 0.8,random_state = 3)\n",
    "    print(\"当主成分比例为:{},降维后的数据维度为: {}\".format(n_components,data_pca.shape))\n",
    "    return X_train_part, X_val"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 442,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "_______________________________________________\n",
      "当主成分比例为:0.7,降维后的数据维度为: (13418L, 32L)\n",
      "                                               \n",
      "K-means begin with clusters: 2\n",
      "CH_score on val: 0.531237878455\n",
      "K-means begin with clusters: 3\n",
      "CH_score on val: 0.462936788121\n",
      "K-means begin with clusters: 4\n",
      "CH_score on val: 0.387548352048\n",
      "K-means begin with clusters: 5\n",
      "CH_score on val: 0.330627184174\n",
      "K-means begin with clusters: 8\n",
      "CH_score on val: 0.119023862972\n",
      "K-means begin with clusters: 10\n",
      "CH_score on val: 0.318275403843\n",
      "K-means begin with clusters: 20\n",
      "CH_score on val: 0.131279744178\n",
      "K-means begin with clusters: 30\n",
      "CH_score on val: 0.158570518399\n",
      "K-means begin with clusters: 40\n",
      "CH_score on val: 0.0744470312526\n",
      "K-means begin with clusters: 50\n",
      "CH_score on val: 0.0745674538135\n",
      "K-means begin with clusters: 60\n",
      "CH_score on val: 0.0483996564342\n",
      "K-means begin with clusters: 70\n",
      "CH_score on val: -0.0933488163794\n",
      "K-means begin with clusters: 80\n",
      "CH_score on val: -0.13897693591\n",
      "K-means begin with clusters: 90\n",
      "CH_score on val: -0.153425880773\n",
      "K-means begin with clusters: 100\n",
      "CH_score on val: -0.0172152848683\n",
      "_______________________________________________\n",
      "当主成分比例为:0.75,降维后的数据维度为: (13418L, 38L)\n",
      "                                               \n",
      "K-means begin with clusters: 2\n",
      "CH_score on val: 0.548974432571\n",
      "K-means begin with clusters: 3\n",
      "CH_score on val: 0.252358593004\n",
      "K-means begin with clusters: 4\n",
      "CH_score on val: 0.355499134226\n",
      "K-means begin with clusters: 5\n",
      "CH_score on val: 0.192678875944\n",
      "K-means begin with clusters: 8\n",
      "CH_score on val: 0.247453541201\n",
      "K-means begin with clusters: 10\n",
      "CH_score on val: 0.202454896706\n",
      "K-means begin with clusters: 20\n",
      "CH_score on val: 0.0467122437335\n",
      "K-means begin with clusters: 30\n",
      "CH_score on val: 0.0887051482195\n",
      "K-means begin with clusters: 40\n",
      "CH_score on val: 0.000946729258524\n",
      "K-means begin with clusters: 50\n",
      "CH_score on val: -0.121427188835\n",
      "K-means begin with clusters: 60\n",
      "CH_score on val: -0.195414359682\n",
      "K-means begin with clusters: 70\n",
      "CH_score on val: -0.134102639275\n",
      "K-means begin with clusters: 80\n",
      "CH_score on val: -0.149521712286\n",
      "K-means begin with clusters: 90\n",
      "CH_score on val: -0.170319405139\n",
      "K-means begin with clusters: 100\n",
      "CH_score on val: -0.116471274464\n",
      "_______________________________________________\n",
      "当主成分比例为:0.8,降维后的数据维度为: (13418L, 44L)\n",
      "                                               \n",
      "K-means begin with clusters: 2\n",
      "CH_score on val: 0.548337941228\n",
      "K-means begin with clusters: 3\n",
      "CH_score on val: 0.423918544478\n",
      "K-means begin with clusters: 4\n",
      "CH_score on val: 0.322835031918\n",
      "K-means begin with clusters: 5\n",
      "CH_score on val: 0.411753369267\n",
      "K-means begin with clusters: 8\n",
      "CH_score on val: 0.168430068784\n",
      "K-means begin with clusters: 10\n",
      "CH_score on val: 0.149889750167\n",
      "K-means begin with clusters: 20\n",
      "CH_score on val: 0.144519361721\n",
      "K-means begin with clusters: 30\n",
      "CH_score on val: 0.110242047317\n",
      "K-means begin with clusters: 40\n",
      "CH_score on val: -0.121117843656\n",
      "K-means begin with clusters: 50\n",
      "CH_score on val: -0.178956353544\n",
      "K-means begin with clusters: 60\n",
      "CH_score on val: -0.1187081451\n",
      "K-means begin with clusters: 70\n",
      "CH_score on val: 0.00748710107899\n",
      "K-means begin with clusters: 80\n",
      "CH_score on val: -0.211797965247\n",
      "K-means begin with clusters: 90\n",
      "CH_score on val: -0.171146929974\n",
      "K-means begin with clusters: 100\n",
      "CH_score on val: -0.0470457828943\n",
      "_______________________________________________\n",
      "当主成分比例为:0.85,降维后的数据维度为: (13418L, 52L)\n",
      "                                               \n",
      "K-means begin with clusters: 2\n",
      "CH_score on val: 0.541217090235\n",
      "K-means begin with clusters: 3\n",
      "CH_score on val: 0.342823189062\n",
      "K-means begin with clusters: 4\n",
      "CH_score on val: 0.353777491316\n",
      "K-means begin with clusters: 5\n",
      "CH_score on val: 0.125675496668\n",
      "K-means begin with clusters: 8\n",
      "CH_score on val: 0.104914421531\n",
      "K-means begin with clusters: 10\n",
      "CH_score on val: 0.248647379607\n",
      "K-means begin with clusters: 20\n",
      "CH_score on val: 0.0770736287754\n",
      "K-means begin with clusters: 30\n",
      "CH_score on val: -0.0110000441343\n",
      "K-means begin with clusters: 40\n",
      "CH_score on val: -0.0782005009482\n",
      "K-means begin with clusters: 50\n",
      "CH_score on val: -0.0118623358926\n",
      "K-means begin with clusters: 60\n",
      "CH_score on val: 0.0275085102619\n",
      "K-means begin with clusters: 70\n",
      "CH_score on val: 0.0148410456897\n",
      "K-means begin with clusters: 80\n",
      "CH_score on val: 0.0282153323203\n",
      "K-means begin with clusters: 90\n",
      "CH_score on val: -0.0236516586019\n",
      "K-means begin with clusters: 100\n",
      "CH_score on val: -0.235210892594\n",
      "_______________________________________________\n",
      "当主成分比例为:0.9,降维后的数据维度为: (13418L, 60L)\n",
      "                                               \n",
      "K-means begin with clusters: 2\n",
      "CH_score on val: 0.608128996184\n",
      "K-means begin with clusters: 3\n",
      "CH_score on val: 0.547861169705\n",
      "K-means begin with clusters: 4\n",
      "CH_score on val: 0.166135571487\n",
      "K-means begin with clusters: 5\n",
      "CH_score on val: 0.160679210214\n",
      "K-means begin with clusters: 8\n",
      "CH_score on val: 0.142514722455\n",
      "K-means begin with clusters: 10\n",
      "CH_score on val: 0.121973305807\n",
      "K-means begin with clusters: 20\n",
      "CH_score on val: 0.0418125775578\n",
      "K-means begin with clusters: 30\n",
      "CH_score on val: -0.0451837008687\n",
      "K-means begin with clusters: 40\n",
      "CH_score on val: 0.0353847389705\n",
      "K-means begin with clusters: 50\n",
      "CH_score on val: 0.0401838692856\n",
      "K-means begin with clusters: 60\n",
      "CH_score on val: 0.017931302157\n",
      "K-means begin with clusters: 70\n",
      "CH_score on val: -0.208479533985\n",
      "K-means begin with clusters: 80\n",
      "CH_score on val: -0.162806211763\n",
      "K-means begin with clusters: 90\n",
      "CH_score on val: -0.00950352330794\n",
      "K-means begin with clusters: 100\n",
      "CH_score on val: -0.168542039636\n",
      "_______________________________________________\n",
      "当主成分比例为:0.95,降维后的数据维度为: (13418L, 71L)\n",
      "                                               \n",
      "K-means begin with clusters: 2\n",
      "CH_score on val: 0.575014085106\n",
      "K-means begin with clusters: 3\n",
      "CH_score on val: 0.153254947607\n",
      "K-means begin with clusters: 4\n",
      "CH_score on val: 0.334872034506\n",
      "K-means begin with clusters: 5\n",
      "CH_score on val: 0.365405762482\n",
      "K-means begin with clusters: 8\n",
      "CH_score on val: 0.140733272313\n",
      "K-means begin with clusters: 10\n",
      "CH_score on val: 0.114888121576\n",
      "K-means begin with clusters: 20\n",
      "CH_score on val: -0.0249077224807\n",
      "K-means begin with clusters: 30\n",
      "CH_score on val: -0.00722597352421\n",
      "K-means begin with clusters: 40\n",
      "CH_score on val: 0.0352442694648\n",
      "K-means begin with clusters: 50\n",
      "CH_score on val: -0.0195143561806\n",
      "K-means begin with clusters: 60\n",
      "CH_score on val: 0.00252965213037\n",
      "K-means begin with clusters: 70\n",
      "CH_score on val: -0.155129071714\n",
      "K-means begin with clusters: 80\n",
      "CH_score on val: -0.134492738778\n",
      "K-means begin with clusters: 90\n",
      "CH_score on val: -0.220549619806\n",
      "K-means begin with clusters: 100\n",
      "CH_score on val: -0.206563098752\n",
      "_______________________________________________\n",
      "当主成分比例为:0.99,降维后的数据维度为: (13418L, 86L)\n",
      "                                               \n",
      "K-means begin with clusters: 2\n",
      "CH_score on val: 0.553229106867\n",
      "K-means begin with clusters: 3\n",
      "CH_score on val: 0.391035927814\n",
      "K-means begin with clusters: 4\n",
      "CH_score on val: 0.387864289617\n",
      "K-means begin with clusters: 5\n",
      "CH_score on val: 0.276346981975\n",
      "K-means begin with clusters: 8\n",
      "CH_score on val: 0.148717018474\n",
      "K-means begin with clusters: 10\n",
      "CH_score on val: -0.067075970151\n",
      "K-means begin with clusters: 20\n",
      "CH_score on val: 0.0752704177271\n",
      "K-means begin with clusters: 30\n",
      "CH_score on val: -0.000777435110235\n",
      "K-means begin with clusters: 40\n",
      "CH_score on val: -0.0512282763218\n",
      "K-means begin with clusters: 50\n",
      "CH_score on val: 0.0137757013791\n",
      "K-means begin with clusters: 60\n",
      "CH_score on val: 0.0147936078167\n",
      "K-means begin with clusters: 70\n",
      "CH_score on val: -0.126701836028\n",
      "K-means begin with clusters: 80\n",
      "CH_score on val: -0.127155831858\n",
      "K-means begin with clusters: 90\n",
      "CH_score on val: -0.133830184377\n",
      "K-means begin with clusters: 100\n",
      "CH_score on val: -0.175326366443\n"
     ]
    }
   ],
   "source": [
    "import copy\n",
    "# 设置超参数（聚类数目K）和PCA主成分比例的搜索范围\n",
    "Ks = [2,3,4,5,8,10, 20, 30,40,50,60,70,80,90,100]\n",
    "ns=[0.7,0.75,0.8,0.85,0.9,0.95,0.99]\n",
    "\n",
    "edata1=copy.deepcopy(edata) #保证每次PCA降维都在原始数据上进行\n",
    "\n",
    "CH_scores_val = []\n",
    "\n",
    "for n in ns:\n",
    "    print(\"_______________________________________________\")\n",
    "    X_train_part, X_val=pca_analysis(edata1,n_components=n)\n",
    "    print(\"                                               \")\n",
    "    \n",
    "    for K in Ks:\n",
    "        ch1 = K_cluster_analysis(K, X_train_part, X_val)\n",
    "        CH_scores_val.append(ch1)\n",
    "        \n",
    "    edata1=copy.deepcopy(edata)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "可以看到，当主成分比例为0.9，K=2时，在校验集上的CH-scoring有最大值，为0.6081,随着K的增大，其相应的CH分数也开始下降。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 449,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x11dcf6d8>]"
      ]
     },
     "execution_count": 449,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 绘制主成分比例为0.9时（即CH_scores_val中第61~75个数据）不同K下的CH分数\n",
    "plt.plot(Ks, np.array(CH_scores_val[60:75]), 'b-')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "#十分类的聚类结果大概显示\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline\n",
    "from sklearn.cluster import MiniBatchKMeans\n",
    "from sklearn import metrics\n",
    "import copy\n",
    "#进行主成分比例为0.9的PCA降维，全部数据进行聚类\n",
    "edata2=copy.deepcopy(edata)\n",
    "pca = PCA(n_components=0.9)\n",
    "\n",
    "pca.fit(edata2)\n",
    "edata2_pca = pca.transform(edata2)\n",
    "\n",
    "mb_kmeans = MiniBatchKMeans(n_clusters = 10)\n",
    "mb_kmeans.fit(edata2)\n",
    "#显示聚类结果\n",
    "#画出聚类结果，每一类用一种颜色\n",
    "colors = ['b','g','r','k','c','m','y','#e24fff','#524C90','#845868']\n",
    "\n",
    "n_clusters = 10\n",
    "\n",
    "y_train_pred = mb_kmeans.labels_\n",
    "cents = mb_kmeans.cluster_centers_#质心\n",
    "\n",
    "for i in range(n_clusters):\n",
    "    index = np.nonzero(y_train_pred==i)[0]\n",
    "    x1 = edata_pca[index,0]\n",
    "    x2 = edata_pca[index,1]\n",
    "   # y_i = y_train[index]\n",
    "    for j in range(len(x1)):\n",
    "        if j < 20:  #每类打印20个\n",
    "            plt.text(x1[j],x2[j],str(int(y_train_pred[j])),color=colors[i],\\\n",
    "                fontdict={'weight': 'bold', 'size': 9})\n",
    "    #plt.scatter(cents[i,0],cents[i,1],marker='x',color=colors[i],linewidths=12)\n",
    "\n",
    "plt.axis([-0.5,1,-0.5,1])\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYQAAAD8CAYAAAB3u9PLAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvhp/UCwAAGXVJREFUeJzt3X2QFfWd7/H3R0YwIprIowKu7l3GQOVmNRwxca+JW6KFFpGs0axGIyZWKOOFW3XjmgBmSZBYK8QktcTZayiz0ZAHo265UC4po8asW64oQ8X4COFh2WWEghEfYhbNoHzvH90jx8OZOWem+zzMzOdVdWr64Xe6v4xjf07379d9FBGYmZkd0egCzMysOTgQzMwMcCCYmVnKgWBmZoADwczMUg4EMzMDcgoESf8oaa+k53pYL0krJW2V9Iykj+SxXzMzy09eZwh3ArN6WX8BMCV9zQP+X077NTOznOQSCBHxGPBKL03mAD+KxHrg/ZJOyGPfZmaWj5Y67WcisLNoviNdtru4kaR5JGcQjBw5cvoHP/jBOpVnZjY4bNy48eWIGNuf99YrEFRm2WHPzIiIVcAqgEKhEO3t7bWuy8xsUJH0n/19b71GGXUAk4vmJwG76rRvMzOrQr0CYS1wVTra6KPA6xGxu9KbzMysfnK5ZCTpZ8A5wBhJHcDXgSMBIuJ2YB1wIbAV2A98Po/9mplZfnIJhIi4vML6AP53HvsyM7Pa8J3KZmYGOBDMzCzlQDAzM8CBYGZmKQeCmZkBDgQzM0s5EMzMDHAgmJlZyoFgZmaAA8HMzFIOBDMzAxwIZmaWciCYmRngQDAzs5QDwczMAAeCmZmlHAhmZgY4EMzMLOVAMDMzwIFgZmapXAJB0ixJmyVtlbSwzPqTJD0q6TeSnpF0YR77NTOz/GQOBEnDgDbgAmAacLmkaSXNvgbcExGnA5cB/5B1v2Zmlq88zhBmAFsjYntEdAF3A3NK2gRwbDp9HLArh/2amVmO8giEicDOovmOdFmxbwBXSuoA1gELym1I0jxJ7ZLaOzs7cyjNzMyqlUcgqMyyKJm/HLgzIiYBFwKrJR2274hYFRGFiCiMHTs2h9LMzKxaeQRCBzC5aH4Sh18Suga4ByAingCOAsbksG8zM8tJHoGwAZgi6RRJw0k6jdeWtPkv4FwASVNJAsHXhMzMmkjmQIiIt4H5wIPAiySjiZ6XdJOki9Jm1wNflPRb4GfA1RFRelnJzMwaqCWPjUTEOpLO4uJlS4qmXwD+Io99mZlZbfhOZTMzAxwIZmaWciCYmRngQDAzs5QDwczMAAeCmZmlHAhmZgY4EMzMLOVAMDMzwIFgZmYpB4KZmQEOBDMzSzkQzMwMcCCYNcSBdw5w1g/OYsQ3R6ClYsdrOxpdkpkDwawRJDG7dTZzTp3T6FLM3uVAMGuAliNaWHz2YlpHtza6FLN3ORDMzAxwIJiZWcqBYNYgm17exL79+wDY9so2dr+xu8EV2VCXy3cqm1nfTW2b+u70zNUzmfvnc7nzU3c2riAb8nIJBEmzgL8HhgF3RMQtZdp8BvgGEMBvI+KzeezbbKCKr0ejSzB7j8yBIGkY0AacB3QAGyStjYgXitpMARYBfxERr0oal3W/ZmaWrzz6EGYAWyNie0R0AXcDpYOrvwi0RcSrABGxN4f9mplZjvIIhInAzqL5jnRZsVagVdLjktanl5gOI2mepHZJ7Z2dnTmUZmZm1cojEFRmWenF0RZgCnAOcDlwh6T3H/amiFURUYiIwtixY3MozczMqpVHIHQAk4vmJwG7yrRZExEHIuI/gM0kAWFmZk0ij0DYAEyRdIqk4cBlwNqSNv8M/CWApDEkl5C257BvMzPLSeZAiIi3gfnAg8CLwD0R8bykmyRdlDZ7ENgn6QXgUeCGiNiXdd9mZpYfRTTnWOhCoRDt7e2NLsPMbECRtDEiCv15rx9dYWZmgAPBzMxSDgQzMwMcCGZmlnIgmJkZ4EAwM7OUA8HMzAAHgpmZpRwIZmYGOBDMzCzlQDAzM8CBYGZmKQeCmZkBDgQzM0s5EMzMDHAgmJlZyoFgZmaAA8HMzFIOBDMzAxwIZmaWyiUQJM2StFnSVkkLe2l3iaSQ1K8vgDYzs9rJHAiShgFtwAXANOBySdPKtBsF/B/gyaz7NDOz/OVxhjAD2BoR2yOiC7gbmFOm3TJgBfBWDvs0M7Oc5REIE4GdRfMd6bJ3STodmBwRD/S2IUnzJLVLau/s7MyhNDMzq1YegaAyy+LdldIRwHeB6yttKCJWRUQhIgpjx47NoTQzM6tWHoHQAUwump8E7CqaHwV8CPi1pB3AR4G17lg2M2sueQTCBmCKpFMkDQcuA9Z2r4yI1yNiTEScHBEnA+uBiyKiPYd9m5lZTjIHQkS8DcwHHgReBO6JiOcl3STpoqzbNzOz+mjJYyMRsQ5YV7JsSQ9tz8ljn2Zmli/fqWxmZoADwczMUg4EMzMDHAhmZpZyIJiZGeBAMDOzlAPBzMwAB4KZmaUcCGZmBjgQzMws5UAwa3IH3jnAWT84ixHfHIGWih2v7Wh0STZIORDMaqjtqTZO+u5JTLh1AkseXUJEVH5TCUnMbp3NnFPLfRGhWX4cCGY1snHXRub/Yj7zZ8zn1vNvZdljy7h/0/193k7LES0sPnsxraNba1Cl2SEOBLMaWbs5+VqQL5z+Ba74n1cw8siRrNm8psFVmfXMgWBWI3v+ew8Ao4aPQhLHDD+GPX/Y0+CqzHrmQDCrkfEjxwPw+z/+nojgja43GH/M+H5ta9PLm9i3fx8A217Zxu43dudWp1k3B4JZjcxunQ3AD5/+IT959ifsP7CfT7Z+sl/bmto2lds33g7AzNUzWfTIotzqNOuWyzemmdnhzph4BitnrWTFv6+g650uFv+vxXx66qf7ta34et9HJ5n1lfozDK4eCoVCtLe3N7oMGyLanmpj+ePL6Xqni3nT57H0nKVIanRZZn0maWNEFPrzXp8h2JDXPTx0+czlnDjqRD53/+c4bcJpXDz14kaXZlZXufQhSJolabOkrZIWlln/ZUkvSHpG0iOS/iSP/ZrlwcNDzRKZA0HSMKANuACYBlwuaVpJs98AhYj4MHAfsCLrfs3y4uGhZok8zhBmAFsjYntEdAF3A++5xz4iHo2I/ensemBSDvs1y0Wew0PNBrI8AmEisLNoviNd1pNrgF+UWyFpnqR2Se2dnZ05lGZWWZ7DQ80Gsjw6lcsNxSg7dEnSlUAB+ES59RGxClgFySijHGozqyjP4aFmA1kegdABTC6anwTsKm0kaSZwI/CJiPhjDvs1y82CMxew4MwFmbfj4as2kOURCBuAKZJOAV4CLgM+W9xA0unA94FZEbE3h32aNR0PX7WBLnMfQkS8DcwHHgReBO6JiOcl3STporTZt4BjgHslPS1pbdb9mjUbD1+1gS6XG9MiYh2wrmTZkqLpmXnsx6yZefiqDXR+uJ1ZTjx81QY6B4INOXl8rWU5Hr5qA52fZWRDSi07fj181QY6B4INKcUdv6PfN5prH7iWNZvX5DYSKK/hq2aN4EtGNqS449esZw4EG1Ly7vitVX+EWSM4EGxIybPjt7s/QhL73tzHsseW8f2N38+zXLO6ciBY02prg5NOggkTYMkSyOPDd3fH7/ee+h7X//L6TB2/3f0RV374Sv7qg38FwEPbH8pepFmDOBCsZrIc0DduhPnzk9ett8KyZXD//fnUteDMBez8vzvZ8zd7uPncm/v9rKHu/oglH19C6+hWAF7+75fzKdKsARwIVhNZD+hr04ebfOELcMUVMHIkrGmyp0CU9kcAjBk5ppElmWXiQLCayHpA35MO/Bk1CiQ45phDy5pFcX/Ec53PAXDuKec2siSzTBwIVhNZD+jj04E/v/99cqnpjTcOLWsWZ0w8g0umXsKihxe9258w5fgp7H5jd+ZtH3jnAGf94CxGfHMEWip2vLaj6vd65JP1lwPBaiLrAX128uGbH/4QfvIT2L8fPtlkT4HYuGsj9714Hwc5+O6y8398PoseWZR525KY3TqbOafOqdy4pKb5v5jP/BnzufX8W1n22DLu35RT58sg4tAsz4FgNVHtAb2njuczzoCVK+F734Prr4fFi+HTTfYUiO6zgs4bOjm45CAjjxzJVX9+FXd+6s7M2245ooXFZy9+t7O6rzX5Edw9c2j2zIFgVevLqKFqDuiVOp4XLICdO5NLTTffnFx6aibNeNdzM9bUbByaPXMgWFX6M2qo0gF9IIwk6k0zPu66GWtqNg7NnjkQrCrdB+8IWLQoObgvXZrtZrGBMJKoN7V+3PWmlzexb/8+ALa9sq2qzmo/grsyh2bPHAhWle4D9cKFySf/Y4+FZ57JdrPYQBhJ1Js873ouZ2rbVG7feDsAM1fPrKqzutY1DQYOzV5ERFO+pk+fHtY8liyJSA7bEXv3Rhx9dERLS8RVV/V/m089lWxv+fKI1auT6Xvvza/mgey2J2+Lyd+ZHOO/NT7+9ld/GwcPHmx0SYPKyvUrY9J3JsW4b42LxQ8vHlS/X6A9+nnc9fchWFVmz4abbkqmH3ggGTV03HHZLvF0dzyvWAFdXc05kqgabU+1sfzx5XS908W86fNYes7Sfj8OA2r7JT6W8PdWlJfLJSNJsyRtlrRV0sIy60dI+nm6/klJJ+exX6ufM86AWbOS6a98JelH6OrKfomn2UcSVZLHEMbSMfFrNiU96x4FY/WWORAkDQPagAuAacDlkqaVNLsGeDUi/gz4LrA8636t/w4cgDFjkoOvBDNmwMGDld/XfYZwww0wbRq8+Wbz3SxWb1mHMJYLlPUvrQc8CsbqL48zhBnA1ojYHhFdwN1A6e2Vc4C70un7gHOV5ZzaMhk3DvbtOzS/YUPSWVxJ9yWelSvh85+HYcPg0kthx46aldr0sg5hLBco3e/3KBirtzwCYSKws2i+I11Wtk1EvA28Dowu3ZCkeZLaJbV3dnbmUJqV+tKX4LXXkukjjzy0/J/+qbr3L1iQBMDSpXBxD5e0+3ID24EDcNZZMGJEcrbSiHCp9jEG5dplHcJYLlCOHn404FEwVn95BEK5T/ql/0dV04aIWBURhYgojB07NofSrNRPf3po+vTTD02//nr122hpSTqAW8s8VaGvN7BJSYf1nL49sqdXfQmkavsAemqXdQhjuUBpHd3qoaPWEHkEQgcwuWh+ErCrpzaSWoDjgFdy2Lf10VtvHZreVfRf6eDB9x44yx1UqznQ9vXu497CpT/6GkjV9gH01C7ruP+eAiWvL/Ex64s8hp1uAKZIOgV4CbgM+GxJm7XAXOAJ4BLgV9HTebnV1FFHJaODADo6Di1/9dXkwHnxxYcOqsuXw4knwuc+l9xN/JWvvHdZuSGijb77uDiQRo+Ga69NAqmny1vV9gH01i7LEMbuQFnx7yvoeqfLZwPWUJnPENI+gfnAg8CLwD0R8bykmyRdlDb7ATBa0lbgy0AVXZhWC5deWn65dOiTfLlP+T/+8XuXve998OyzybJt22B3+lSFRt993NdAqrYPoJaPO/DZgDWLXO5DiIh1EdEaEf8jIm5Oly2JiLXp9FsRcWlE/FlEzIiI7Xns1/rujjuST/ilRow4dOAsd1B95ZX3LnvzTfjd75JlM2cm9yVA/77HYNOmQ6OeisOlP/oaSNX2AfhxBzYk9PcW51q//OiK2up+FMXevREHDyaPouh+DEW5dR/+cM/tS61cGTFpUsS4cRGLFyfte9P9SIzu19y5/f939edxGNU+xmAwP+7ABg8yPLqi4Qf+nl4OhNrq7cBZbt3f/V3fD7SN0tdAMhtMsgSCn2U0RPX2HKFy67761aQvYSA8d2jBguRlZn2jaNLBPoVCIdrb2xtdhpnZgCJpY0QU+vNefx+CmZkBDgSzIavaR3bY0OE+BLMhyN+5YOX4DMFsCMr62G4bnBwIZkNQ1sd22+DkQDAbgmr5KA4buBwIZkOQH8Vh5bhT2WwI8lNWrRzfmGY2CLQ91cbyx5fT9U4X86bPY+k5S/3U1CEqy41pPkMwG+A8hNTy4j4EswHOQ0gtLw4EswGulkNIfTfz0OJLRmYDXPEQ0jHDxuQ2hNSXooYenyGYDXC1GkLqS1FDj88QzAa4Wg0h9d3MQ48DwWwQWHDmAhacme+3AtXqUpQ1r0yXjCQdL+khSVvSnx8o0+Y0SU9Iel7SM5L+Oss+zaw+fDfz0JP1DGEh8EhE3CJpYTr/1ZI2+4GrImKLpBOBjZIejIjXMu7bzGrIdzMPPZnuVJa0GTgnInZLOgH4dUScWuE9vwUuiYgtvbXzncpmZn3XyK/QHB8RuwHSn+N6ayxpBjAc2NbD+nmS2iW1d3Z2ZizNzMz6ouIlI0kPAxPKrLqxLztKzyBWA3Mj4mC5NhGxClgFyRlCX7ZvZmbZVAyEiJjZ0zpJeySdUHTJaG8P7Y4F/gX4WkSs73e1ZmZWM1kvGa0F5qbTc4HD7lqRNBy4H/hRRNybcX9mZlYjWQPhFuA8SVuA89J5JBUk3ZG2+QzwceBqSU+nr9My7tfMzHLm70MwMxtEGjnKyMzMBgkHgpmZAQ4EMzNLORDMzAxwIJiZWcqBYGZmgAPBzMxSDgQzMwMcCGZmlnIgmJkZ4EAwM7OUA8HMzAAHgpmZpRwIZmYGOBDMzCzlQDAzM8CBYGZmKQeCmZkBDgQzM0s5EMzMDMgYCJKOl/SQpC3pzw/00vZYSS9Jui3LPs3MrDayniEsBB6JiCnAI+l8T5YB/5pxf2ZmViNZA2EOcFc6fRfwqXKNJE0HxgO/zLg/MzOrkayBMD4idgOkP8eVNpB0BPBt4IZKG5M0T1K7pPbOzs6MpZmZWV+0VGog6WFgQplVN1a5j+uAdRGxU1KvDSNiFbAKoFAoRJXbNzOzHFQMhIiY2dM6SXsknRARuyWdAOwt0+xjwNmSrgOOAYZL+kNE9NbfYGZmdVYxECpYC8wFbkl/riltEBFXdE9LuhooOAzMzJpP1j6EW4DzJG0BzkvnkVSQdEfW4szMrH4U0ZyX6guFQrS3tze6DDOzAUXSxogo9Oe9vlPZzMwAB4KZmaUcCGZmBjgQzMws5UAwMzPAgWBmZikHgpmZAQ4EMzNLORDMzAxo4juVJXUC/1mjzY8BXq7RtmthoNULrrkeBlq94Jrr4dSIGNWfN2Z9uF3NRMTYWm1bUnt/b+1uhIFWL7jmehho9YJrrgdJ/X7mjy8ZmZkZ4EAwM7PUUA2EVY0uoI8GWr3gmuthoNULrrke+l1v03Yqm5lZfQ3VMwQzMyvhQDAzM2CIBIKk4yU9JGlL+vMDvbQ9VtJLkm6rZ40lNVSsV9Jpkp6Q9LykZyT9dYNqnSVps6Stkg77rmxJIyT9PF3/pKST61/le+qpVO+XJb2Q/k4fkfQnjaizpKZeay5qd4mkkNTwIZLV1CzpM+nv+nlJP613jSW1VPq7OEnSo5J+k/5tXNiIOovq+UdJeyU918N6SVqZ/nuekfSRqjYcEYP+BawAFqbTC4HlvbT9e+CnwG3NXC/QCkxJp08EdgPvr3Odw4BtwJ8Cw4HfAtNK2lwH3J5OXwb8vIG/12rq/Uvg6HT6S42st9qa03ajgMeA9UCh2WsGpgC/AT6Qzo9r8npXAV9Kp6cBOxr8O/448BHguR7WXwj8AhDwUeDJarY7JM4QgDnAXen0XcCnyjWSNB0YD/yyTnX1pGK9EfG7iNiSTu8C9gI1u5mvBzOArRGxPSK6gLtJai9W/G+5DzhXkupYY7GK9UbEoxGxP51dD0yqc42lqvkdAywj+SDxVj2L60E1NX8RaIuIVwEiYm+dayxWTb0BHJtOHwfsqmN9h4mIx4BXemkyB/hRJNYD75d0QqXtDpVAGB8RuwHSn+NKG0g6Avg2cEOdayunYr3FJM0g+WSzrQ61FZsI7Cya70iXlW0TEW8DrwOj61Ld4aqpt9g1JJ+yGqlizZJOByZHxAP1LKwX1fyeW4FWSY9LWi9pVt2qO1w19X4DuFJSB7AOWFCf0vqtr3/rQBM/uqKvJD0MTCiz6sYqN3EdsC4idtbjA2wO9XZv5wRgNTA3Ig7mUVtfdl9mWek45mra1EvVtUi6EigAn6hpRZX1WnP6Qea7wNX1KqgK1fyeW0guG51Dchb2b5I+FBGv1bi2cqqp93Lgzoj4tqSPAavTeuv9/1y1+vX/3aAJhIiY2dM6SXsknRARu9MDaLnT048BZ0u6DjgGGC7pDxHRYydeg+tF0rHAvwBfS08L660DmFw0P4nDT6W723RIaiE53e7tVLeWqqkXSTNJgvkTEfHHOtXWk0o1jwI+BPw6/SAzAVgr6aKI6PczbTKq9u9ifUQcAP5D0maSgNhQnxIPq6VSvdcAswAi4glJR5E89K6Rl7p6U9XfeqmhcsloLTA3nZ4LrCltEBFXRMRJEXEy8Dck199qEgZVqFivpOHA/SR13lvH2optAKZIOiWt5zKS2osV/1suAX4Vaa9XA1SsN7388n3gogZf1+7Wa80R8XpEjImIk9O/3fUktTcqDKC6v4t/JunAR9IYkktI2+ta5SHV1PtfwLkAkqYCRwGdda2yb9YCV6WjjT4KvN59GbpXjewpr9eL5Jr1I8CW9Ofx6fICcEeZ9lfT2FFGFesFrgQOAE8XvU5rQK0XAr8j6b+4MV12E8lBCZL/ce4FtgJPAX/a4L+FSvU+DOwp+p2ubWS91dRc0vbXNHiUUZW/ZwHfAV4AngUua/J6pwGPk4xAeho4v8H1/oxkZOEBkrOBa4BrgWuLfr9t6b/n2Wr/JvzoCjMzA4bOJSMzM6vAgWBmZoADwczMUg4EMzMDHAhmZpZyIJiZGeBAMDOz1P8H2Q1TW5t90zIAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "#二分类的聚类结果大概显示\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline\n",
    "from sklearn.cluster import MiniBatchKMeans\n",
    "from sklearn import metrics\n",
    "import copy\n",
    "#进行主成分比例为0.9的PCA降维，全部数据进行聚类\n",
    "edata3=copy.deepcopy(edata)\n",
    "pca = PCA(n_components=0.9)\n",
    "\n",
    "pca.fit(edata3)\n",
    "edata3_pca = pca.transform(edata3)\n",
    "\n",
    "mb_kmeans = MiniBatchKMeans(n_clusters = 2)\n",
    "mb_kmeans.fit(edata3)\n",
    "#显示聚类结果\n",
    "#画出聚类结果，每一类用一种颜色\n",
    "colors = ['b','g']\n",
    "\n",
    "n_clusters = 2\n",
    "\n",
    "y_train_pred = mb_kmeans.labels_\n",
    "cents = mb_kmeans.cluster_centers_#质心\n",
    "\n",
    "for i in range(n_clusters):\n",
    "    index = np.nonzero(y_train_pred==i)[0]\n",
    "    x1 = edata3_pca[index,0]\n",
    "    x2 = edata3_pca[index,1]\n",
    "   # y_i = y_train[index]\n",
    "    for j in range(len(x1)):\n",
    "        if j < 20:  #每类打印20个\n",
    "            plt.text(x1[j],x2[j],str(int(y_train_pred[j])),color=colors[i],\\\n",
    "                fontdict={'weight': 'bold', 'size': 9})\n",
    "    #plt.scatter(cents[i,0],cents[i,1],marker='x',color=colors[i],linewidths=12)\n",
    "\n",
    "plt.axis([-0.5,1,-0.5,1])\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 2",
   "language": "python",
   "name": "python2"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.15"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
